Skip to content

Conversation

@lquerel
Copy link
Contributor

@lquerel lquerel commented Jan 19, 2026

Closes #1812

This PR adds support for multiple pipeline groups and multiple pipelines per group. It is still possible to start the engine with a single pipeline, but it is now also possible to start the engine with a configuration file describing one or more pipeline groups. An example configuration is included in this PR.

The controller documentation has been updated to provide more details. Optimal placement of the ITS and pipelines per NUMA node is not yet implemented. Named channels are not implemented yet.

I did not observe any performance regression with this PR.

@github-actions github-actions bot added the rust Pull requests that update Rust code label Jan 19, 2026
@lquerel lquerel changed the title Support multiple groups and pipelines [WIP] Support multiple groups and pipelines Jan 19, 2026
@lquerel lquerel self-assigned this Jan 19, 2026
@lquerel lquerel added the engine-capability Internal engine features label Jan 19, 2026
@codecov
Copy link

codecov bot commented Jan 19, 2026

Codecov Report

❌ Patch coverage is 33.23944% with 237 lines in your changes missing coverage. Please review.
✅ Project coverage is 84.66%. Comparing base (107ef6b) to head (29ed40e).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1823      +/-   ##
==========================================
- Coverage   84.73%   84.66%   -0.08%     
==========================================
  Files         499      499              
  Lines      146658   146784     +126     
==========================================
- Hits       124276   124269       -7     
- Misses      21848    21981     +133     
  Partials      534      534              
Components Coverage Δ
otap-dataflow 86.06% <33.23%> (-0.13%) ⬇️
query_abstraction 80.61% <ø> (ø)
query_engine 90.52% <ø> (ø)
syslog_cef_receivers ∅ <ø> (∅)
otel-arrow-go 53.50% <ø> (ø)
quiver 90.66% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@lquerel lquerel changed the title [WIP] Support multiple groups and pipelines Support multiple groups and pipelines Jan 20, 2026
@lquerel lquerel marked this pull request as ready for review January 20, 2026 00:20
@lquerel lquerel requested a review from a team as a code owner January 20, 2026 00:20
@lalitb
Copy link
Member

lalitb commented Jan 20, 2026

Thanks for the PR. Minor question on core_count with multiple pipelines: I noticed the sample config uses core_set with explicit non-overlapping ranges for each pipeline.

  1. Is core_set the recommended approach when running multiple pipelines that need core isolation?
  2. When using core_count across multiple pipelines, is it expected that they may end up sharing the same cores?

/// Supports:
/// - JSON files: `.json`
/// - YAML files: `.yaml`, `.yml`
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
Copy link
Member

@albertlockett albertlockett Jan 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the future, maybe we'd want to consider the config crate for this? https://crates.io/crates/config . It might reduce some of the boilerplate loading config

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is indeed this repetition issue, but at the same time there is also this error reporting problem described here: #1832. I need to test this crate config and other approaches to see what will help resolve a number of issues around configuration parsing.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. One thing that's nice about this config crate is that it's possible to override the config file with environment variables:
https://docs.rs/config/0.15.19/config/#example

This can be helpful for users who have some dynamic config, but don't want to set up the machinery to deploy a templated config file.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sounds good. Whatever we do, let's not invent a crate for configuration 😂

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree. I will check this crate and validate the quality of the error messages

Copy link
Member

@lalitb lalitb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thanks for the PR. Had a nit question, not directly related to this PR changes.

@lquerel
Copy link
Contributor Author

lquerel commented Jan 20, 2026

@lalitb Thanks for the PR. Minor question on core_count with multiple pipelines: I noticed the sample config uses core_set with explicit non-overlapping ranges for each pipeline.

1. Is `core_set` the recommended approach when running multiple pipelines that need core isolation?

2. When using `core_count` across multiple pipelines, is it expected that they may end up sharing the same cores?

This part of the system still needs improvement. I would like to reach a situation where:

  • Either the number of cores (without specific allocation) to use is defined in the pipeline configuration and the controller decides on the optimal placement.
  • Or the exact core allocation is defined in the pipeline configuration and the controller follows the configuration strictly.

I created the following GH issue for tracking: #1837

Copy link
Contributor

@jmacd jmacd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question: It's not obvious from the PR how the distinction between single-pipeline configuration and pipeline-group configuration is done. I see the EngineConfig type already existed, so I suspect that's making it hard to see how it all connects.

/// Supports:
/// - JSON files: `.json`
/// - YAML files: `.yaml`, `.yml`
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sounds good. Whatever we do, let's not invent a crate for configuration 😂

# Conflicts:
#	rust/otap-dataflow/crates/controller/src/lib.rs
#	rust/otap-dataflow/crates/state/src/store.rs
@lquerel
Copy link
Contributor Author

lquerel commented Jan 20, 2026

@jmacd Question: It's not obvious from the PR how the distinction between single-pipeline configuration and pipeline-group configuration is done. I see the EngineConfig type already existed, so I suspect that's making it hard to see how it all connects.

For now, I have only added an extra parameter to the command line (--config, -c) to allow specifying the global engine configuration, and I have kept the parameter (--pipeline, -p) for starting a single pipeline.

@lquerel lquerel enabled auto-merge January 20, 2026 19:23
@lquerel lquerel added this pull request to the merge queue Jan 20, 2026
Merged via the queue into open-telemetry:main with commit 448d7ac Jan 20, 2026
43 of 44 checks passed
@lquerel lquerel deleted the controller-config branch January 20, 2026 19:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

engine-capability Internal engine features rust Pull requests that update Rust code

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Support for multiple pipeline groups and multiple pipelines

4 participants